/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package co.com.ces4.produccion.server.services;

import co.com.ces4.produccion.client.SolicitudProduccionService;
import co.com.ces4.produccion.jpa.controllers.DetalleSolicitudProduccionJpaController;
import co.com.ces4.produccion.jpa.controllers.SolicitudProduccionJpaController;
import co.com.ces4.produccion.jpa.controllers.exceptions.IllegalOrphanException;
import co.com.ces4.produccion.jpa.controllers.exceptions.NonexistentEntityException;
import co.com.ces4.produccion.jpa.controllers.exceptions.PreexistingEntityException;
import co.com.ces4.produccion.jpa.entities.DetalleSolicitudProduccion;
import co.com.ces4.produccion.jpa.entities.SolicitudProduccion;
import co.com.ces4.produccion.jpa.entities.Usuario;
import com.google.gwt.user.server.rpc.RemoteServiceServlet;
import java.util.Date;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.servlet.http.HttpSession;

/**
 *
 * @author Sebastian
 */
public class SolicitudProduccionServiceImpl extends RemoteServiceServlet implements SolicitudProduccionService {

    public SolicitudProduccion guardarSolicitudProduccion(SolicitudProduccion solicitudProduccion) throws RuntimeException {
        SolicitudProduccionJpaController solicitudProduccionJpaController = (SolicitudProduccionJpaController) getServletContext().getAttribute("solicitudProduccionJpaController");
        solicitudProduccionJpaController.create(solicitudProduccion);
        if (!solicitudProduccion.getDetalleSolicitudProduccionList().isEmpty()) {
            DetalleSolicitudProduccionJpaController detalleSolicitudProduccionJpaController = (DetalleSolicitudProduccionJpaController) getServletContext().getAttribute("detalleSolicitudProduccionJpaController");
            for (DetalleSolicitudProduccion detalleSolicitudProduccion : solicitudProduccion.getDetalleSolicitudProduccionList()) {
                try {
                    detalleSolicitudProduccionJpaController.create(detalleSolicitudProduccion);
                } catch (PreexistingEntityException ex) {
                    Logger.getLogger(SolicitudProduccionServiceImpl.class.getName()).log(Level.SEVERE, "detalle de la solicitud de producci&oacute;n no pudo ser guardado debido a que ya ha sido creado anteriormente" + ex.getMessage());
                    throw new RuntimeException("Señor usuario, el detalle de la solicitud de producci&oacute;n ya se encuentra registrado en la base de datos, por tanto no pudo ser almacenado");
                } catch (Exception ex) {
                    Logger.getLogger(SolicitudProduccionServiceImpl.class.getName()).log(Level.SEVERE, "Otra excepci&oacute;n:" + ex.getMessage());
                    throw new RuntimeException("Señor usuario, ocurri&oacute; un error inesperado al intentar guardar los detalles de la solicitud de producci&oacute;n en la base de datos");
                }
            }
        }
        return solicitudProduccion;
    }

    public List<SolicitudProduccion> getSolicitudesProduccion() throws RuntimeException {
        SolicitudProduccionJpaController solicitudProduccionJpaController = (SolicitudProduccionJpaController) getServletContext().getAttribute("solicitudProduccionJpaController");
        return solicitudProduccionJpaController.findSolicitudProduccionEntities();
    }

    public List<SolicitudProduccion> getSolicitudProduccionList(Date fechaInicio, Date fechaFin) throws RuntimeException {
        SolicitudProduccionJpaController solicitudProduccionJpaController = (SolicitudProduccionJpaController) getServletContext().getAttribute("solicitudProduccionJpaController");
        return solicitudProduccionJpaController.getSolicitudProduccionList(fechaInicio, fechaFin);
    }

    public Usuario getUserSession() throws RuntimeException {
        HttpSession sesion = getThreadLocalRequest().getSession();
        if (sesion == null) {
            return null;
        }

        Usuario user = (Usuario) sesion.getAttribute("user");
        return user;
    }

    public void cancelarSolicitudesProduccion(List<SolicitudProduccion> solicitudesProduccion) throws RuntimeException {
        SolicitudProduccionJpaController solicitudProduccionJpaController = (SolicitudProduccionJpaController) getServletContext().getAttribute("solicitudProduccionJpaController");
        for (SolicitudProduccion solicitudProduccion : solicitudesProduccion) {
            solicitudProduccion.setSnestado(false);
            try {
                solicitudProduccionJpaController.edit(solicitudProduccion);
            } catch (IllegalOrphanException ex) {
                Logger.getLogger(SolicitudProduccionServiceImpl.class.getName()).log(Level.SEVERE, ex.getMessage());
                throw new RuntimeException("Señor usuario, ocurri&oacute; un error inesperado en el sistema, intente de nuevo m&aacute;s tarde");
            } catch (NonexistentEntityException ex) {
                Logger.getLogger(SolicitudProduccionServiceImpl.class.getName()).log(Level.SEVERE, "Registro no encontrado en la base de datos:" + ex.getMessage());
                throw new RuntimeException("Señor usuario, la solicitud de produccion no se encuentra registrada en la base de datos, por tanto no pudo ser cancelada");
            } catch (Exception ex) {
                Logger.getLogger(SolicitudProduccionServiceImpl.class.getName()).log(Level.SEVERE, "Otra excepci&oacute;n:" + ex.getMessage());
                throw new RuntimeException("Señor usuario, ocurri&oacute; un error inesperado en el sistema, intente de nuevo m&aacute;s tarde");
            }
        }
    }
}
